package com.dms.modules.order.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dms.common.exception.BusinessException;
import com.dms.modules.order.entity.Coupon;
import com.dms.modules.order.entity.UserCoupon;
import com.dms.modules.order.mapper.UserCouponMapper;
import com.dms.modules.order.service.CouponService;
import com.dms.modules.order.service.UserCouponService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 用户优惠券服务实现类
 */
@Service
public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements UserCouponService {

    @Autowired
    private CouponService couponService;

    @Override
    public UserCoupon getUserCoupon(Long userId, Long couponId) {
        if (userId == null || couponId == null) {
            return null;
        }

        // 查询用户优惠券
        LambdaQueryWrapper<UserCoupon> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserCoupon::getUserId, userId)
                   .eq(UserCoupon::getCouponId, couponId)
                   .eq(UserCoupon::getStatus, 0); // 未使用状态

        UserCoupon userCoupon = getOne(queryWrapper);
        
        if (userCoupon != null) {
            // 获取优惠券信息
            Coupon coupon = couponService.getById(couponId);
            if (coupon != null) {
                userCoupon.setCoupon(coupon);
            }
        }
        
        return userCoupon;
    }

    @Override
    public List<UserCoupon> getAvailableCoupons(Long userId, Long merchantId, BigDecimal totalAmount) {
        if (userId == null) {
            return new ArrayList<>();
        }

        // 查询用户所有未使用的优惠券
        LambdaQueryWrapper<UserCoupon> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserCoupon::getUserId, userId)
                   .eq(UserCoupon::getStatus, 0) // 未使用状态
                   .gt(UserCoupon::getExpireTime, LocalDateTime.now()); // 未过期

        List<UserCoupon> userCoupons = list(queryWrapper);
        
        // 获取优惠券信息并验证是否可用
        List<UserCoupon> availableCoupons = new ArrayList<>();
        
        for (UserCoupon userCoupon : userCoupons) {
            Coupon coupon = couponService.getById(userCoupon.getCouponId());
            if (coupon != null && validateCoupon(coupon, totalAmount, merchantId)) {
                userCoupon.setCoupon(coupon);
                availableCoupons.add(userCoupon);
            }
        }
        
        return availableCoupons;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean useCoupon(Long userId, Long couponId, Long orderId) {
        if (userId == null || couponId == null || orderId == null) {
            return false;
        }

        // 查询用户优惠券
        LambdaQueryWrapper<UserCoupon> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserCoupon::getUserId, userId)
                   .eq(UserCoupon::getCouponId, couponId)
                   .eq(UserCoupon::getStatus, 0); // 未使用状态

        UserCoupon userCoupon = getOne(queryWrapper);
        
        if (userCoupon == null) {
            throw new BusinessException("优惠券不存在或已使用");
        }
        
        // 更新优惠券状态
        userCoupon.setStatus(1); // 已使用
        userCoupon.setUsedTime(LocalDateTime.now());
        userCoupon.setOrderId(orderId);
        
        boolean updated = updateById(userCoupon);
        
        if (updated) {
            // 更新优惠券剩余数量
            Coupon coupon = couponService.getById(couponId);
            if (coupon != null && coupon.getRemain() > 0) {
                coupon.setRemain(coupon.getRemain() - 1);
                couponService.updateById(coupon);
            }
        }
        
        return updated;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean receiveCoupon(Long userId, Long couponId) {
        if (userId == null || couponId == null) {
            return false;
        }

        // 查询优惠券
        Coupon coupon = couponService.getById(couponId);
        if (coupon == null || coupon.getStatus() != 1 || coupon.getRemain() <= 0) {
            throw new BusinessException("优惠券不存在或已领完");
        }
        
        // 检查用户是否已领取过该优惠券
        LambdaQueryWrapper<UserCoupon> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserCoupon::getUserId, userId)
                   .eq(UserCoupon::getCouponId, couponId);
        
        long count = count(queryWrapper);
        if (count > 0) {
            throw new BusinessException("您已领取过该优惠券");
        }
        
        // 创建用户优惠券
        UserCoupon userCoupon = new UserCoupon();
        userCoupon.setUserId(userId);
        userCoupon.setCouponId(couponId);
        userCoupon.setStatus(0); // 未使用
        userCoupon.setGetTime(LocalDateTime.now());
        userCoupon.setExpireTime(coupon.getEndTime());
        
        boolean saved = save(userCoupon);
        
        if (saved) {
            // 更新优惠券剩余数量
            coupon.setRemain(coupon.getRemain() - 1);
            couponService.updateById(coupon);
        }
        
        return saved;
    }
    
    /**
     * 验证优惠券是否可用于当前订单
     * @param coupon 优惠券
     * @param totalAmount 订单金额
     * @param merchantId 商家ID
     * @return 是否可用
     */
    private boolean validateCoupon(Coupon coupon, BigDecimal totalAmount, Long merchantId) {
        // 检查最低消费
        if (coupon.getMinSpend() != null && totalAmount.compareTo(coupon.getMinSpend()) < 0) {
            return false;
        }
        
        // 检查商家限制
        if (coupon.getMerchantId() != null && !coupon.getMerchantId().equals(merchantId)) {
            return false;
        }
        
        // 检查分类限制
        if (coupon.getCategoryId() != null) {
            // 这里需要根据实际情况检查商品是否属于该分类
            // 简化处理，暂时返回true
        }
        
        // 检查有效期
        LocalDateTime now = LocalDateTime.now();
        if (now.isBefore(coupon.getStartTime()) || now.isAfter(coupon.getEndTime())) {
            return false;
        }
        
        return true;
    }
} 